﻿#region License
/*
 * Microsoft Public License (Ms-PL)
 * 
 * This license governs use of the accompanying software. If you use the software, you accept this license. 
 * If you do not accept the license, do not use the software.
 *
 * 1. Definitions
 *
 * The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law.
 *
 * A "contribution" is the original software, or any additions or changes to the software.
 *
 * A "contributor" is any person that distributes its contribution under this license.
 *
 * "Licensed patents" are a contributor's patent claims that read directly on its contribution.
 *
 * 2. Grant of Rights
 *
 * (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, 
 * each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, 
 * prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
 *
 * (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, 
 * each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, 
 * use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the 
 * contribution in the software.
 *
 * 3. Conditions and Limitations
 *
 * (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
 *
 * (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, 
 * your patent license from such contributor to the software ends automatically.
 *
 * (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, 
 * and attribution notices that are present in the software.
 *
 * (D) If you distribute any portion of the software in source code form, you may do so only under this license by including 
 * a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, 
 * you may only do so under a license that complies with this license.
 *
 * (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. 
 * You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, 
 * the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. 
 */
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace RelmMudServer.TCP
{
    #region Packet reader
    public class PacketReader
    {
        private MemoryStream stream;
        private BinaryReader reader;

        public PacketReader(byte[] pak)
        {
            this.stream = new MemoryStream(pak);
            this.reader = new BinaryReader(this.stream);
        }

        public void Close()
        {
            this.reader.Close();
            this.stream.Close();
        }

        public UInt32 ReadUInt32()
        {
            byte[] buffer = this.reader.ReadBytes(4);
            return BitConverter.ToUInt32(buffer, 0);
        }

        public UInt16 ReadUInt16()
        {
            byte[] buffer = this.reader.ReadBytes(2);
            return BitConverter.ToUInt16(buffer, 0);
        }

        public Int32 ReadInt32()
        {
            return this.reader.ReadInt32();
        }

        public Int16 ReadInt16()
        {
            return this.reader.ReadInt16();
        }

        public String ReadString(Int32 length)
        {
            byte[] buffer = this.reader.ReadBytes(length);
            return Encoding.ASCII.GetString(buffer);
        }

        public SByte ReadSByte()
        {
            return this.reader.ReadSByte();
        }

        public Byte ReadByte()
        {
            return this.reader.ReadByte();
        }
    }
    #endregion

    #region Packet writer
    public class PacketWriter
    {
        List<byte> buffer;
        UInt32 pid = 0;

        public PacketWriter(UInt32 id)
        {
            this.buffer = new List<byte>();
            this.pid = id;
        }

        public void WriteByte(Byte val)
        {
            buffer.Add(val);
        }

        public void WriteUInt16(UInt16 val)
        {
            buffer.AddRange(BitConverter.GetBytes(val));
        }

        public void WriteInt16(Int16 val)
        {
            buffer.AddRange(BitConverter.GetBytes(val));
        }

        public void WriteUInt32(UInt32 val)
        {
            buffer.AddRange(BitConverter.GetBytes(val));
        }

        public void WriteInt32(Int32 val)
        {
            buffer.AddRange(BitConverter.GetBytes(val));
        }

        public void WriteString(String val)
        {
            short str_len = (short)val.Length;
            this.WriteInt16(str_len);
            this.buffer.AddRange(Encoding.ASCII.GetBytes(val));
        }

        public byte[] Finish()
        {
            List<byte> tmp_buffer = new List<byte>();
            tmp_buffer.AddRange(BitConverter.GetBytes(buffer.Count));
            tmp_buffer.AddRange(BitConverter.GetBytes(this.pid));
            buffer.Capacity = buffer.Count;
            tmp_buffer.AddRange(buffer.ToArray());
            tmp_buffer.Capacity = tmp_buffer.Count;
            buffer.Clear();
            return tmp_buffer.ToArray();
        }
    }
    #endregion
}
